package com.qf.rabbitmq.chongfuxiaofei;

import com.qf.rabbitmq.util.ConnectionUtil;
import com.rabbitmq.client.*;
import redis.clients.jedis.Jedis;

import java.io.IOException;

//消费者
public class Consumer {
    //    声明了一个 队列名
    private static final String QUEUENAME="bk2102";
    public static void main(String[] args) throws Exception {
//        获取连接
        Connection connection = ConnectionUtil.getConnection();
//        获取通道
        Channel channel = connection.createChannel();
//        通过通道 声明队列
        channel.queueDeclare(QUEUENAME, false, false, false, null);

        //       每次服务器只拿一条消息来处理  处理完之后在拿下一条
        channel.basicQos(1);
        /*
         * 参数1  队列的名字
         * 参数2  自动应答   消息队列有提个保证机制，保证消息一定能投放到消费者身上，如果没有投放到 会重试，
         * 服务器如何认为消息已经被投放成功了  消费者给一个应答
         * 参数3  消费者
         * */
        channel.basicConsume(QUEUENAME, false,  new DefaultConsumer(channel){

            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                String messageId= properties.getMessageId();
                Jedis jedis=new Jedis("10.9.45.217",6379);

                String s = jedis.get(messageId);
                if(s!=null){
                    System.out.println("消息实际已经消费了  直接应答");
                    //              手动应答
//                参数1   消息的标签
//                因为会有很多个消息 我们要告诉服务器应答的是哪一个
//                参数2 批量应答tag 之前的所有tag   设置为false 只应答当前消息

                    channel.basicAck(envelope.getDeliveryTag(),false );
                    return;
                }
                jedis.set(messageId,"sadasdasd");


//                根据ID 去redis中查询 如果查询到了就代表消费过了  直接ACK应答  处理完应答后在拿下一条

                System.out.println("第一个消费者收到的"+new String(body));


            }
        } );
    }
}
